package com.tool.cn.util;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


/**
 * zip压缩工具类
 * 
 * @author wangzh 2017年10月17日 下午3:54:19
 */
public class GzUtil {
	
	private static Logger log= LoggerFactory.getLogger(GzUtil.class);
	
	
	/**
	 * 压缩gz文件
	 * @param sourceFile 物理路径源文件
	 * @param gzipFileName 输出gz文件
	 * @return
	 */
	public static boolean linuxGzipFile(String sourceFile, String gzipFileName ) {
		return linuxGzipFile(sourceFile, gzipFileName, false);
	}
	
	/**
	 * 压缩gz文件
	 * @param sourceFile 物理路径源文件
	 * @param gzipFileName 输出gz文件
	 * @param delete 删除原文件
	 * @return
	 */
	public static boolean linuxGzipFile(String sourceFile, String gzipFileName,boolean delete ) {
		
		GZIPOutputStream out=null;
		BufferedInputStream input=null;
		try {
			// 创建zip输出流
			out = new GZIPOutputStream(new FileOutputStream(gzipFileName));
			// 建立gzip压缩文件输入流
			input = new BufferedInputStream(new FileInputStream(new File(sourceFile)));

			int tag;
			// 将源文件写入到zip文件中
			while ((tag = input.read()) != -1) {
				out.write(tag);
			}
			
			out.flush();
		} catch (Exception e) {
			log.error("Gzip File :"+sourceFile+" Error",e);
			return false;
			
		}finally {
			try {
				if(input!=null) {
					input.close();
				}
				if(out!=null) {
					out.close();
				}
			} catch (IOException e) {
				log.error("Io Close Error:"+e.toString(),e);
			}
		}
		if(delete) {
			new File(sourceFile).delete();
		}
		return true;
	}
	
	/**
	 * 解压gz文件
	 * @param sourceGzFile 压缩文件
	 * @param outputFile 输出文件
	 * @return
	 */
	public static boolean linuxUngzipFile(String sourceGzFile,String outputFile) {
		 GZIPInputStream input=null;
		 FileOutputStream output=null;
       try {
           //建立gzip解压工作流
          input = new GZIPInputStream(new FileInputStream(sourceGzFile));
           //建立解压文件输出流
           output= new FileOutputStream(outputFile);

          
           byte[] buf=new byte[1024];
           int len;
           
           while ((len = input.read(buf)) >0) {
               output.write(buf,0,len);
           }

          output.flush();
       } catch (Exception e){
           log.error(e.toString(),e);
           return false;
       }finally{
       	try {
				if(input!=null) {
					input.close();
				}
				if(output!=null) {
					output.close();
				}
			} catch (IOException e) {
				log.error("Io Close Error:"+e.toString(),e);
			}
       }
       return true;
	}

}
